package gestoresPasajeros;

import Control.DireccionJpaController;
import Control.EntityMan;
import Control.PasajeroJpaController;
import Entidades.Direccion;
import Entidades.Localidad;
import Entidades.Pasajero;
import ManejadorDeErrores.ManejadorVentanaEmergente;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;




public class GestorPasajeros {

        private static GestorPasajeros singleton=new GestorPasajeros();
        //formateamos la fecha
	private SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
        
	private GestorPasajeros() {
		
	}
        
        public static GestorPasajeros getInstance(){
        return singleton;}



public List <Pasajero> buscarPasajeros(String apellido,String nombre, String tipoDoc, String nro){
    //parametros lista(Apellido,Nombres, tipoDocumento, numero)
     PasajeroJpaController t= new PasajeroJpaController(EntityMan.getInstance());
        List<Pasajero> pasajeros=  t.findPasajeroEntities();
         List<Pasajero> resultado=new ArrayList<>();
         
        for(Pasajero unPasajero: pasajeros){
            //comprobamos Apellido
            if((unPasajero.getApellido().contains(apellido)) && 
            //comprobamos Nombre
              (unPasajero.getNombre().contains(nombre)) &&  
            //comprobamos Tipo de Documento
              (unPasajero.getTipoDoc().getDescripcion().contains(tipoDoc))&&
            //comprobamos Tipo de Documento
                    (String.valueOf(unPasajero.getNroDoc())).contains(nro))
                    
                    {
                        resultado.add(unPasajero);
                    }
                    }

	return resultado;
}

public boolean altaPasajero(String nombre, String Apellido, String TipoDoc,String nroDoc,String CUIT,String FechaNac,String PosIVA,String Calle,String nro,String depto,String piso,String Pais,String Provincia,String Localidad,String CP,String email,String telefono , String ocupacion, String nacionalidad) {
	
    boolean ret=false;
    Pasajero nuevo= new Pasajero();
    PasajeroJpaController t= new PasajeroJpaController(EntityMan.getInstance());
    try{
     
     int id=t.getPasajeroCount();
    //seteamos los campos
    
     nuevo.setIdPasajero(id+1);
    nuevo.setApellido(Apellido);
    nuevo.setNombre(nombre);
    nuevo.setNroDoc(Integer.parseInt(nroDoc));
   /* nuevo.setCuit_cuil(new Long(convertirCuit(CUIT)));*/
    if(!CUIT.equals("           ")){
    nuevo.setCuit_cuil(Long.parseLong(CUIT));
    }
    nuevo.setTelefono( (new Long(telefono)));
    nuevo.setEmail(email);
    
    //seteamos datos del NomencaldorDP
   NomencladorDatosPersonales nomDP=NomencladorDatosPersonales.getInstance();
     
     nuevo.setOcupacion(nomDP.getOcupacion(ocupacion));
     nuevo.setNacionalidad(nomDP.getNacionalidad(nacionalidad));
     nuevo.setTipoDoc(nomDP.getTipoDocumento(TipoDoc));
     nuevo.setPosicionIva(nomDP.getPosicionFrenteIva(PosIVA));
    
     
    //seteamos la direccion
    NomencladorGeografico nomGeo=NomencladorGeografico.getInstance();
    Localidad unaLocalidad=nomGeo.getLocalidad(Pais, Provincia, Localidad);
    Direccion unaDireccion= new Direccion(id+1, Calle, Integer.parseInt(nro), depto, piso,Integer.parseInt( CP));
    unaDireccion.setLocalidad(unaLocalidad);
     nuevo.setDireccion(unaDireccion);
     
     DireccionJpaController dir= new DireccionJpaController(EntityMan.getInstance());
 
    try{dir.create(unaDireccion);}
    catch (Exception ex) {
               
              }
     
    //seteamos la fecha de nacimiento con un tipo Date
   
	 Date fechaNac= formatoFecha.parse(FechaNac);
     nuevo.setFechaNac(fechaNac);
     
      //enviamos el objeto creado al controlador de la BD para su almacenamiento
    t.create(nuevo);
    ret=true;
    return ret;
    }
	catch (ParseException ex) {
			return ret;	 }
        catch (Exception ex) {
            
                Logger.getLogger(GestorPasajeros.class.getName()).log(Level.SEVERE, null, ex);
                return ret;
            }
   
  	
}
public boolean modificarPasajero(){
	return false;
}
public boolean eliminarPasajero(){
	
	
	return false;
}

public boolean validarCampos(String nombre, String apellido, String cuit, String fecha_nac, String calle, String nro, String depto, String piso, String cp, String email, String telefono,String tipo, String nro_dni){
        
    if((nombre.matches("[a-zA-Z]([a-z]|[A-Z]|\\s)+")&& !nombre.matches("\\s+"))&&(nombre.matches("[a-zA-Z]([a-z]|[A-Z]|\\s)+")&& !nombre.matches("\\s+"))&&validarDNI(tipo,nro_dni,0)&&(isFechaValida(fecha_nac))&&(calle.matches ("[a-zA-z]([a-zA-z]|\\s)+"))&&(nro.matches ("([0-9]+)"))&&(depto.matches("[a-zA-Z]|[0]"))&&(piso.matches("[0-9]|[1-9][0-9]|[n]|[N]"))&&(cp.matches ("([0-9]+)"))&&(telefono.matches("[0-9]+"))&&(email.matches("[-\\w\\.]+@\\w+\\.\\w+")|(email.matches("\\s*")))){
        return true;
    }
    else{ ManejadorVentanaEmergente manejador= ManejadorVentanaEmergente.getInstance();
         manejador.ventEmerNombre(nombre.matches("[a-zA-Z]([a-z]|[A-Z]|\\s)+")&& !nombre.matches("\\s+"));
         manejador.ventEmerApell(apellido.matches("[a-zA-Z]([a-z]|[A-Z]|\\s)+")&& !apellido.matches("\\s+"));
         validarDNI(tipo,nro_dni,0);
         /*manejador.ventEmerCuit(((cuit.contains(nro_dni))&& (cuit.matches("[0-9][0-9][-][0-9]*[-][0-9]"))&&(cuit.length()==13))|(cuit.matches("\\s*")));*/
       
         manejador.ventEmerFechaNac(isFechaValida(fecha_nac) && fechaNofutura(fecha_nac));
         manejador.ventEmerCalle(calle.matches ("[a-zA-z]([a-zA-z]|\\s)+"));
         manejador.ventEmerNroDir(nro.matches ("([0-9]+)"));
         manejador.ventEmerDpto(depto.matches("[a-zA-Z]([0-9]+)|[0]"));
         manejador.ventEmerPiso(piso.matches("[0-9]|[1-9][0-9]|[n]|[N]"));
         manejador.ventEmerCP(cp.matches ("([0-9]+)"));
         manejador.ventEmerTel(telefono.matches("[0-9]+"));
         manejador.ventEmerEmail(email.matches("[-\\w\\.]+@\\w+\\.\\w+")|(email.matches("\\s*")));
           return false;
            }
     
}
public boolean validarCampos(String nombre, String apellido){

         ManejadorVentanaEmergente manejador= ManejadorVentanaEmergente.getInstance();   
       if((apellido.matches("[a-zA-Z]([a-z]|[A-Z]|\\s)*")| apellido.matches("\\s*"))&&(nombre.matches("[a-zA-Z]([a-z]|[A-Z]|\\s)*")| nombre.matches("\\s*")))
       
       return true;
       
else{ 
         manejador.ventEmerApell(apellido.matches("[a-zA-Z]([a-z]|[A-Z]|\\s)*")| apellido.matches("\\s*"));
         manejador.ventEmerNombre(nombre.matches("[a-zA-Z]([a-z]|[A-Z]|\\s)*")| nombre.matches("\\s*"));
        return false;
}
}

public boolean validarDNI(String tipo, String nro, int bandera){
	  ManejadorVentanaEmergente manejador= ManejadorVentanaEmergente.getInstance(); 
	   if(bandera==1){switch(tipo){
           case "LC": {
               if(((nro.length()==10)&&(nro.matches("(([F]|[f])[-][0-9]*)")))|(nro.matches("\\s*"))){
                    return true;  
               }
               else{manejador.ventEmerLC(((nro.length()==10)&&(nro.matches("(([F]|[f])[-][0-9]*)")))|(nro.matches("\\s*"))) ;
                    return false;
               }
           }
           case "LE": {
               if(((nro.length()==10)&&(nro.matches("(([m]|[M])[-][0-9]*)")))|(nro.matches("\\s*"))){
                    return true;}
               else{
                    manejador.ventEmerLE(((nro.length()==10)&&(nro.matches("(([m]|[M])[-][0-9]*)")))|(nro.matches("\\s*"))) ;
                    return false;
               }
           }
           case "DNI":{
           if(((nro.length()==8)&&(nro.matches("([0-9]*)")))|(nro.matches("\\s*"))){
                return true;
           }
           else{
               manejador.ventEmerDni(((nro.length()==8)&&(nro.matches("([0-9]*)")))|(nro.matches("\\s*"))) ;  
           return false;
           }
               }
           case "CI": {
               if(((nro.length()==10)&&(nro.matches("([0-9]*[-][a-zA-Z])")))|(nro.matches("\\s*")))
               {return true;
               }    
               else{
               manejador.ventEmerCI(((nro.length()==10)&&(nro.matches("([0-9]*[-][a-zA-Z])")))|(nro.matches("\\s*"))) ;
           return false;
               }
           }
           }}
           else{
           switch(tipo){
           case "LC": {manejador.ventEmerLC((nro.length()==10)&&(nro.matches("(([F]|[f])[-][0-9]*)"))) ;
           return true;
           }
           case "LE": {manejador.ventEmerLE((nro.length()==10)&&(nro.matches("(([m]|[M])[-][0-9]*)"))) ;
          return true;
           }
           case "DNI":{
           manejador.ventEmerDni((nro.length()==8)&&(nro.matches("([0-9]*)"))) ;  
           return true;
               }
           case "CI":{ {manejador.ventEmerCI((nro.length()==10)&&(nro.matches("([0-9]*[-][a-zA-Z])"))) ;
           return true;
           }
           }
           }
           }
           return true;
}
public boolean verificarPasajeroNoAlojado(Pasajero unPasajero){
	return false;
}
private boolean fechaNofutura(String fecha_nac){
    Date fechaNac=new Date();
    try{
	   fechaNac= formatoFecha.parse(fecha_nac);
    }
	catch (ParseException ex) {
				 }
    
    Date fechaHoy=new Date();
    if(fechaHoy.getTime()<fechaNac.getTime()){
   return false;}
    else return true;
   
}
/*private String convertirCuit(String CUIT){
    String cuitSinGuiones=(CUIT.substring(0,2))+(CUIT.substring(3,11))+(CUIT.substring(12,13));
   return cuitSinGuiones;
   
}*/
 public static boolean isFechaValida(String fecha) {
     try {
            SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());
            formatoFecha.setLenient(false);
            formatoFecha.parse(fecha);
        } catch (ParseException e) {
            return false;
        }
        return true;
    }

}